package com.yeung.primary;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Properties;

public class MainApp {
    private static ApplicationContext context =
            new ClassPathXmlApplicationContext("applicationContext.xml");

    public static void main(String[] args) {

//        从ioc容器中获取bean实例
        HelloWorld hw = (HelloWorld) context.getBean("helloWorld");
        hw.getMessage();
        Car car = (Car) context.getBean("car");
        System.out.println(car.toString());


    }

    @Test
    public void innerObjectTest() {
        Person p = (Person) context.getBean("person");
        System.out.println(p.toString());
    }

    /**
     * 不推荐使用中文命名方法
     * 只是方便理解采用的,项目中不可使用
     */
    @Test
    public void 级联赋值测试() {
        Person p = (Person) context.getBean("person2");
        System.out.println(p.toString());

    }

    @Test
    public void 对集合进行赋值() {
        Person p = (Person) context.getBean("person3");
        System.out.println(p.toString());
    }

    @Test
    public void 测试获取数据配置() {
        Properties properties = context.getBean(Properties.class);
        System.out.println(properties.toString());
    }

    @Test
    public void 测试自动装配() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans-autowire.xml");
        Object person = context.getBean("person");
        System.out.println(person);

    }

    @Test
    public void 继承配置测试() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans-autowire.xml");
        Object person = context.getBean("person4");//它不是Java中的继承的意思,而是 继承它的数据
        System.out.println(person);

    }

    /**
     * 默认singleton: 单例模式
     * prototype:每次返回一个新的对象
     */
    @Test
    public void 作用域测试() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans-autowire.xml");
        Object person = context.getBean("address");//它不是Java中的继承的意思,而是 继承它的数据
        System.out.println(person);

    }

    @Test
    public void c3p0连接测试() throws SQLException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans-properties.xml.xml");
        DataSource dataSource = (DataSource) context.getBean("dataSource");//它不是Java中的继承的意思,而是 继承它的数据
        System.out.println(dataSource.getConnection());

    }

    /**
     * SpEl表达式:
     * 支持运行时查询和操作对象图的强大的表达式语言.
     * 语法类似于EL表达式  spel使用#{} 作为定界符,
     * SpEL为bean的属性进行动态赋值提供了便利
     * 1. 通过bean的id对bean进行引用
     * 2. 调用方法一级作用对象中的属性
     * 3. 计算表达式的值
     * 4. 正则表达式的匹配
     */
    @Test
    public void aa() {

    }


}
